/**
 *  RMTransactionsFacadeProxy.java        22-ott-2009
 *   
 * Copyright (c) 2009 mentalsmash.org
 *  
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 * 
 *  http://www.apache.org/licenses/LICENSE-2.0
 * 
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 * 
 *  The use of the Apache License does not indicate that this project is
 *  affiliated with the Apache Software Foundation.
 */

package org.mentalsmash.tazio.transactions.management.wrm;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import org.mentalsmash.tazio.transactions.identifiers.TID;
import org.mentalsmash.tazio.transactions.management.StatusResponse;
import org.mentalsmash.tazio.transactions.management.TazioTransaction;
import org.mentalsmash.tazio.transactions.management.rm.RMTransactionsFacade;
import org.mentalsmash.tazio.transactions.objects.RootSet;

/**
 * The <tt>RMTransactionsFacadeProxy</tt> acts as a wrm-side proxy for the
 * ReplicaManager transactions interface.
 * 
 * @author Andrea Reale
 * @see StatusResponse
 * @see RMTransactionsFacade
 * @version 0.0.1
 */
class RMTransactionsFacadeProxy implements RMTransactionsFacade {

    private final AtomicInteger seqNoCounter = new AtomicInteger(1);

    private final Lock lock = new ReentrantLock();

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.mentalsmash.tazio.transactions.rm.RMTransactionsFacade#beginTransaction
     * ()
     */
    @Override
    public long beginTransaction() {
	lock.lock(); // just to make local transactions work
	try {
	    return seqNoCounter.get();
	} finally {
	    lock.unlock(); // just to make local transactions work
	}
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.mentalsmash.tazio.transactions.rm.RMTransactionsFacade#commitTransaction
     * (org.mentalsmash.tazio.transactions.impl.TazioTransaction)
     */
    @Override
    public long commitTransaction(final TazioTransaction transaction) {
	return seqNoCounter.incrementAndGet();
    }

//    /*
//     * (non-Javadoc)
//     * 
//     * @see
//     * org.mentalsmash.tazio.transactions.rm.RMTransactionsFacade#getRootObject
//     * ()
//     */
//    @Override
//    public RootSet getRootSet() {
//	// TODO Auto-generated method stub
//	return null;
//
//    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.mentalsmash.tazio.transactions.rm.RMTransactionsFacade#whatAboutThisTx
     * (org.mentalsmash.tazio.transactions.identifiers.TID)
     */
    @Override
    public StatusResponse whatAboutThisTx(final TID tid) {
	// TODO Auto-generated method stub
	return null;
    }

    public void lock() {
	lock.lock();
    }

    public void unlock() {
	lock.unlock();
    }

}
